package com.quectel.util.kit;

import com.quectel.util.client.snowflake.SnowflakeClient;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

/**
 * 雪花算法解析 结构 Snowflake的结构如下(每部分用-分开):
 * 0 - 00000000000000000000000000000000000000000 - 0000000000 - 000000000000
 * 第一位为未使用 表示正数
 * 接下来的41位为毫秒级时间(41位的长度可以使用69年)
 * 然后是10位的长度最多支持部署1024个节点 0~1023
 * 最后12位是毫秒内的计数（12位的计数顺序号支持每个节点每毫秒产生4096个ID序号）
 * 一共加起来刚好64位，为一个Long型。
 */
@Slf4j
public class Snowflake {
    @Getter
    private static SnowflakeClient defaultClient;

    /**
     * 无参构造
     */
    private Snowflake() {
    }

    /**
     * @param snowflakeClient
     */
    public static void setDefaultClient(SnowflakeClient snowflakeClient) {
        Snowflake.defaultClient = snowflakeClient;
    }

    /**
     * 回收机器id和心跳任务
     */
    public static void free() {
        defaultClient.free();
    }

    /**
     * 是否申请到了机器id
     *
     * @return
     */
    public static boolean isReady() {
        return defaultClient.isReady();
    }

    /**
     * 产生下一个ID
     *
     * @return
     */
    public static long nextId() {
        return defaultClient.nextId();
    }
}
